/* Miscellaneous private stuff. */
enum { DISCONNECTED, DISCONNECTING, CONNECTED } status;
-
+ int active;
struct list_head list; /* scheduling list */
atomic_t refcnt;
struct net_device *dev;
static void __netif_up(netif_t *netif)
{
struct net_device *dev = netif->dev;
- netif_carrier_on(dev);
+ netif_tx_lock_bh(dev);
+ netif->active = 1;
+ netif_tx_unlock_bh(dev);
enable_irq(netif->irq);
netif_schedule_work(netif);
}
struct net_device *dev = netif->dev;
disable_irq(netif->irq);
netif_tx_lock_bh(dev);
- netif_carrier_off(dev);
+ netif->active = 0;
netif_tx_unlock_bh(dev);
netif_deschedule_work(netif);
}
return ERR_PTR(-ENOMEM);
}
- netif_carrier_off(dev);
-
netif = netdev_priv(dev);
memset(netif, 0, sizeof(*netif));
netif->domid = domid;
BUG_ON(skb->dev != dev);
/* Drop the packet if the target domain has no receive buffers. */
- if (unlikely(!netif_carrier_ok(dev)) ||
+ if (!netif->active ||
(netif->rx_req_cons_peek == netif->rx.sring->req_prod) ||
((netif->rx_req_cons_peek - netif->rx.rsp_prod_pvt) ==
NET_RX_RING_SIZE))
return;
spin_lock_irq(&net_schedule_list_lock);
- if (!__on_net_schedule_list(netif) &&
- likely(netif_carrier_ok(netif->dev))) {
+ if (!__on_net_schedule_list(netif) && netif->active) {
list_add_tail(&netif->list, &net_schedule_list);
netif_get(netif);
}